"""
它的表头占两行，其中最后两列有两层，我们在读取数据时需要将它们变成销售人数和销售金额。

思路
使用 pd.read_excel() 的 header 参数指定两行为表头，它是一个多层索引，每个列为一个元组，读取后会发现被合并的单元格会被 Unnamed:xxx 字样占位。

然后用 map 方法来一一处理通过判断来去掉包含 Unnamed 字符串，再将剩下的合并起来。
"""

import pandas as pd

df = pd.read_excel('./data/header-merged.xlsx', header=[0, 1])
# 通过将 header 参数设置为 [0, 1]，
# 指示 read_excel() 函数将文件的第一行和第二行作为表头，并将它们作为多级索引。
# 这样做可以正确地处理包含合并单元格的表头。

print(df)
'''
                    时间                播放量  销售     
    Unnamed: 0_level_1 Unnamed: 1_level_1  人数   金额
0  2023-06-03 10:00:00               3131  23  645
1  2023-06-03 11:00:00               5234  14  634
2  2023-06-03 12:00:00              12351  45  523
'''
print(df.columns)

cols = df.columns.map(lambda x: "".join("" if "Unnamed" in i else i for i in x))
print(cols)  # Index(['时间', '播放量', '销售人数', '销售金额'], dtype='object')
"""
以上代码的逻辑如下：

df.columns 返回 DataFrame 的列索引对象，表示所有的列标签。
使用 map() 方法遍历每个列标签，并应用 lambda 函数进行处理。
在 lambda 函数中，通过遍历每个标签的字符来处理列标签：
如果标签中包含字符串 "Unnamed"，则将其替换为空字符串，这是为了去除不必要的 "Unnamed" 标记。
否则，保留原始标签。
使用 ''.join() 将处理后的字符列表组合成一个字符串。
最终，cols 变量为处理后的索引对象。
"""


def func(x):
    cols = []
    for i in x[::-1]:
        if "Unnamed" not in i:
            cols.append(i)
            break

    return "".join(cols)


cols2 = df.columns.map(func)
print(cols2)  # Index(['时间', '播放量', '人数', '金额'], dtype='object')

df.columns = cols
print(df)
